aboutsummaryrefslogtreecommitdiff
path: root/src/routes/projects/[id]/+page.server.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes/projects/[id]/+page.server.ts')
-rw-r--r--src/routes/projects/[id]/+page.server.ts102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/routes/projects/[id]/+page.server.ts b/src/routes/projects/[id]/+page.server.ts
new file mode 100644
index 0000000..b20af6c
--- /dev/null
+++ b/src/routes/projects/[id]/+page.server.ts
@@ -0,0 +1,102 @@
+import { error, fail, redirect } from '@sveltejs/kit';
+import { getById } from '$lib/server/services/projects';
+import {
+ add,
+ edit,
+ archive,
+ complete,
+ loadProjectDashboard,
+} from '$lib/server/services/routines';
+import { numericId, parseFormString } from '$lib/server/services/validation';
+import { parseIntervalToDays } from '$lib/shared/routine-metrics';
+import type { Actions, PageServerLoad } from './$types';
+
+function parseFrequencyDays(value: FormDataEntryValue | null): number {
+ const raw = value?.toString() ?? '';
+ const days = parseIntervalToDays(raw);
+ if (days === null) {
+ throw new Error('Invalid interval');
+ }
+ return days;
+}
+
+export const load: PageServerLoad = async ({ params }) => {
+ const id = numericId(params.id);
+ const project = await getById(id);
+ if (!project || project.archived) {
+ throw error(404, 'Projet introuvable');
+ }
+ const dashboard = await loadProjectDashboard(id, Date.now());
+ return {
+ project: { id: project.id, name: project.name },
+ routines: dashboard.routines,
+ healthScore: dashboard.healthScore,
+ };
+};
+
+export const actions: Actions = {
+ addRoutine: async ({ request, params }) => {
+ const data = await request.formData();
+ const name = parseFormString(data.get('name'));
+ if (!name) {
+ return fail(400, { error: 'Le nom est requis' });
+ }
+ try {
+ await add(
+ numericId(params.id),
+ name,
+ parseFrequencyDays(data.get('frequencyDays')),
+ );
+ } catch {
+ return fail(400, { error: 'Fréquence invalide' });
+ }
+ return { success: true };
+ },
+
+ editRoutine: async ({ request }) => {
+ const data = await request.formData();
+ const name = parseFormString(data.get('name'));
+ if (!name) {
+ return fail(400, { error: 'Le nom est requis' });
+ }
+ try {
+ await edit(
+ numericId(data.get('id')),
+ name,
+ parseFrequencyDays(data.get('frequencyDays')),
+ );
+ } catch {
+ return fail(400, { error: 'Modification invalide' });
+ }
+ return { success: true };
+ },
+
+ complete: async ({ request }) => {
+ const data = await request.formData();
+ try {
+ await complete(
+ numericId(data.get('id')),
+ parseFormString(data.get('note')),
+ new Date().toISOString(),
+ );
+ } catch {
+ return fail(400, { error: 'Routine introuvable' });
+ }
+ return { success: true };
+ },
+
+ archiveRoutine: async ({ request }) => {
+ const data = await request.formData();
+ try {
+ await archive(numericId(data.get('id')));
+ } catch {
+ return fail(400, { error: 'Routine introuvable' });
+ }
+ return { success: true };
+ },
+
+ archiveProject: async ({ params }) => {
+ await archive(numericId(params.id));
+ throw redirect(303, '/');
+ },
+};